"""应用工厂模块，负责创建和配置Flask应用实例"""

# 标准库导入
import os
from typing import Optional

# 第三方库导入
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

# 本地应用导入
from .config import Config
from .errors import register_error_handlers

# 初始化扩展
db = SQLAlchemy()
migrate = Migrate()

def create_app(config: Optional[dict] = None) -> Flask:
    """创建并配置Flask应用
    
    Args:
        config: 可选的配置字典，会覆盖默认配置
        
    Returns:
        配置好的Flask应用实例
    """
    app = Flask(__name__)
    
    # 1. 加载配置
    Config.init_app(app)
    if config:
        app.config.update(config)
    
    # 2. 初始化扩展
    _init_extensions(app)
    
    # 3. 注册错误处理器
    register_error_handlers(app)
    
    # 4. 注册蓝图
    _register_blueprints(app)
    
    return app

def _init_extensions(app: Flask) -> None:
    """初始化所有扩展"""
    db.init_app(app)
    migrate.init_app(app, db)
    
    # 延迟导入模型以确保db初始化完成
    from . import models  # noqa

def _register_blueprints(app: Flask) -> None:
    """注册所有蓝图"""
    from .auth import auth_bp
    from .notes import notes_bp
    from .ai_style import ai_style_bp
    
    app.register_blueprint(auth_bp, url_prefix='/api/auth')
    app.register_blueprint(notes_bp, url_prefix='/api')
    app.register_blueprint(ai_style_bp, url_prefix='/api')
